package bancosys.tec.persist.authorization;

import java.io.Serializable;

import bancosys.tec.persist.Persistable;
import bancosys.tec.persist.persister.PersistenceAction;
import bancosys.tec.utils.date.Timestamp;

/**
 * Interface para o mecanismo de autorização.
 * 
 * @author Tulius Lima (Bankware Java Team)
 * @author Alexandre (Bankware Java Team)
 */
public interface Authorizable extends Persistable {
    /**
     * Devolve uma instância de um authorizer que irá autorizar/rejeitar os dados no mecanismo de persitência.
     * 
     * @return instância do authorizer.
     */
    Authorizer<?> getAuthorizer();

    /**
     * @return o nome do usuario que executou o comando
     */
    String getUser();

    /**
     * Seta o usuario.
     * 
     * @param user o nome do usuario que executou o comando
     */
    void setUser(String user);

    /**
     * @return a data e hora em que esse commando foi criado
     */
    Timestamp getTimeStamp();

    /**
     * Seta o timeStamp.
     * 
     * @param timeStamp a data e hora em que esse commando foi criado
     */
    void setTimeStamp(Timestamp timeStamp);

    /**
     * @return o tipo desse comando. Pode ser uma das contantes INSERT, DELETE ou UPDATE
     */
    PersistenceAction getPersistenceAction();

    /**
     * Seta o tipo do comando.
     * 
     * @param commandType tipo desse comando. Pode ser uma das contantes INSERT, DELETE ou UPDATE
     */
    void setPersistenceAction(PersistenceAction commandType);

    /**
     * Devolve <code>true</code> se o objeto está em autorização, <code>false</code> caso contrário.
     * 
     * @return <code>true</code> se o objeto está em autorização, <code>false</code> caso contrário.
     */
    Boolean getAuth();

    /**
     * Usado pela autorização para definir se o objeto está em autorização ou não.
     * 
     * @param auth <code>true</code> quando o objeto está em autorização, <code>false</code> caso contrário.
     */
    void setAuth(Boolean auth);

    /**
     * Devolve o id de autorização do objeto.
     * 
     * @return o id de autorização do objeto.
     */
    Serializable getAuthId();

    /**
     * Define o id de autorização do objeto.
     * 
     * @param authId o id de autorização do objeto.
     */
    void setAuthId(Serializable authId);

    /**
     * Obtém o modo de autorização da entidade. Permite que a entidade defina se vai para a base quente ou para a base fria independente do
     * status de autorização do sistema.
     * 
     * @param action save action sendo executada, null caso seja um insert ou update comum.
     * @return authorizationMode
     */
    AuthorizationMode getAuthorizationMode(Object action);
}